#ifndef __M_UUIDER_H__
#define __M_UUIDER_H__
#include <iostream>
#include <random>
#include <sstream>
#include <iomanip>
#include <atomic>


/*
    封装一个uuid类实现随机数，通用的唯一识别id
*/

class UUIDer
{
public:
    static std::string uuid()
    {
        std::random_device rd;
        std::mt19937_64 gernator(rd()); // 生成随机数对象gernator
        std::uniform_int_distribution<int> distribution(0, 255);

        // distribution(gernator)获取一个0~255的随机数

        std::stringstream ss;
        for (size_t i = 0; i < 8; i++)
        {
            ss << std::setw(2) << std::setfill('0') << std::hex << distribution(gernator); // 获取16进制
            if (i == 3 || i == 5 || i == 7)
            {
                ss << "-";
            }
        }
        static std::atomic<size_t> seq(1); // 定义一个原子类型整数1
        size_t num = seq.fetch_add(1);  // 原子++操作保证每个值序号不同
        for (int i = 7; i >= 0; i--)
        {
            ss << std::setw(2) << std::setfill('0') << std::hex << ((num >> (i * 8)) & 0xff);
            if (i == 6)
                ss << "-";
        }

        // std::cout << ss.str() << std::endl;
        return ss.str();
    }
};

#endif